# -*- coding: utf-8 -*-
from licenca.models import *
from django.contrib.auth.decorators import login_required, permission_required

import sys
import subprocess
import sha
import datetime
import calendar
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django.http.response import HttpResponseRedirect

mes_nome = {
    1   : 'Janeiro',
    2   : 'Fevereiro',
    3   : 'Março',
    4   : 'Abril',
    5   : 'Maio',
    6   : 'Junho',
    7   : 'Julho',
    8   : 'Agosto',
    9   : 'Setembro',
    10  : 'Outubro',
    11  : 'Novembro',
    12  : 'Dezembro'
}

def desativar_licenca(request, inicio):
    for licenca in Licenca.objects.filter(fim__lt = inicio, estado = 1):
        licenca.estado = 0
        licenca.save()

def checar_licenca(request):
    hoje = datetime.date.today()
    
    primeiro_dia, ultimo_dia = 1, calendar.monthrange(hoje.year, hoje.month)[1]
    inicio = datetime.date(hoje.year, hoje.month, primeiro_dia)
    fim    = datetime.date(hoje.year, hoje.month, ultimo_dia)
    
    desativar_licenca(request, inicio)
    
    if Licenca.objects.filter(inicio = inicio, fim = fim, estado = 1).count() > 0:
        return True
    else:
        return False

def get_disk_serial_number(arg = None):
    if arg != None:
        disk = arg
    else:
        disk = 'sda'
        
    p1 = subprocess.Popen(['/sbin/udevadm', 'info', '--query=property', '--name=' + disk], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    p2 = subprocess.Popen(['grep', '-i', 'id_serial_short'], stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    p1.stdout.close()
    p3 = subprocess.Popen(['cut', '-d', '=', '-f', '2'], stdin=p2.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    p2.stdout.close()
    
    out, err = p3.communicate()
    
    if err != '':
        # print >> sys.stderr, err
        return err.replace('\n', '')
    
    if out != '':
        # print out
        return out.replace('\n', '')

def get_key(disk_serial, inicio, fim):
    try:
        inicio = map(int, inicio.split('/'))
        inicio = datetime.date(inicio[2], inicio[1], inicio[0])
        
        fim = map(int, fim.split('/'))
        fim = datetime.date(fim[2], fim[1], fim[0])
        
        if fim < inicio:
            print >> sys.stderr, ('Fim menor que Início. Forneça uma data corretamente')
            return None
        
        serial = sha.new(disk_serial + str(inicio) + str(fim)).hexdigest()
        
        return serial
    except ValueError, e:
        print >> sys.stderr, 'Parece que você informou uma data incorreta. Informe valores corretamente'
        return None

@login_required
#@permission_required("licenca.view_home")
def home(request):
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    licenca = checar_licenca(request)
        
    if Licenca.objects.filter(estado__lt = 0).count() > 0:
        licencas = Licenca.objects.filter(estado__lt = 0)
        return render_to_response(
            'licenca/ativo.html', locals(),
            context_instance=RequestContext(request)
        )
    else:
        # licenca = Licenca.objects.filter(estado__lt = 0)
        return render_to_response(
            'licenca/bloqueado.html', locals(),
            context_instance=RequestContext(request)
        )

def registrar(request):
    if request.method == "POST":
        inicio = request.POST['inicio']
        fim    = request.POST['fim']
        chave  = request.POST['chave']
        
        diaA = int(inicio[:2])
        mesA = int(inicio[3:5])
        anoA = int(inicio[6:10])
        
        try:
            inicio_date = datetime.datetime(anoA, mesA, diaA)
        except:
            request.session['aviso'] = 'Data inválida'
            return HttpResponseRedirect('/licenca/')
        
        diaB = int(fim[:2])
        mesB = int(fim[3:5])
        anoB = int(fim[6:10])
        
        try:
            fim_date = datetime.datetime(anoB, mesB, diaB)
        except:
            request.session['aviso'] = 'Data inválida'
            return HttpResponseRedirect('/licenca/')
        
        dias = (fim_date - inicio_date + datetime.timedelta(1)).days
        
        chave_real = get_key(get_disk_serial_number(), str(diaA) + '/' + str(mesA) + '/' + str(anoA), str(diaB) + '/' + str(mesB) + '/' + str(anoB))
        
        if chave == chave_real[:4]:
            if Licenca.objects.filter(inicio = inicio_date, fim = fim_date, estado = 1).count() == 0:
                licenca = Licenca(inicio = inicio_date, fim = fim_date, chave = chave, dias = dias, ultimo_registro = datetime.date.today(), estado = 1)
                try:
                    licenca.save()
                    request.session['mensagem'] = 'Chave registrada. Mês: ' + mes_nome[mesA] + ' de ' + str(fim_date.year)
                except:
                    request.session['aviso'] = 'Chave inválida. Chave já foi registrada uma vez e não pode ser usada novamente'
            else:
                request.session['mensagem'] = 'Chave já registrada'
        else:
            request.session['aviso'] = 'Chave inválida'
        
    
    return HttpResponseRedirect('/licenca/')
